/*
 * Copyright 2008-2023 dexian.vip. All rights reserved.
 * Support: http://www.dexian.vip
 * License: http://www.dexian.vip/license
 */

package vip.dexian.common.query;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.SuperBuilder;

import java.io.Serial;

/**
 * 构造分页条件，如第几页，每页显示多少条，搜索条件等
 *
 * @author 挺好的 2023年05月30日 15:36
 */
@Data
@EqualsAndHashCode (callSuper = false)
@SuperBuilder
public class Pageable extends BaseQueryable {

    @Serial
    private static final long serialVersionUID = -6799977854414145290L;

    /**
     * 默认第几页
     */
    private static final int DEFAULT_PAGE_NUMBER = 1;

    /**
     * 默认每次显示多少条
     */
    private static final int DEFAULT_PAGE_SIZE = 10;

    /**
     * 最大一次显示多少条
     */
    private static final int MAX_PAGE_SIZE = 1000;

    /**
     * 是否调用count()方法统计数据
     */
    private static final boolean DEFAULT_IS_COUNT = true;

    /**
     * 页码
     */
    private int pageNumber = DEFAULT_PAGE_NUMBER;

    /**
     * 每页显示多少条
     */
    private int pageSize = DEFAULT_PAGE_SIZE;

    /**
     * 是否调用count()方法统计数据
     */
    private boolean isCount = DEFAULT_IS_COUNT;

    public Pageable () {
    }

    /**
     * 创建pageable。 如果pageNumber为null或者<=0，则默认使用第一页。 如果pageSize == null || <=0
     * ，则使用默认pageSize。如果超过MAX_PAGE_SIZE，则使用默认pageSize
     *
     * @param pageNumber
     *         页码
     * @param pageSize
     *         每页显示多少条
     */
    public Pageable (Integer pageNumber, Integer pageSize) {
        if (pageNumber != null && pageNumber >= 1) {
            this.pageNumber = pageNumber;
        }
        if (pageSize != null && pageSize >= 1 && pageSize <= MAX_PAGE_SIZE) {
            this.pageSize = pageSize;
        }
    }

    /**
     * 设置pageNumber，如果<1，则默认第一页。
     *
     * @param pageNumber
     *         页码
     */
    public void setPageNumber (Integer pageNumber) {
        if (pageNumber == null || pageNumber < 1) {
            pageNumber = DEFAULT_PAGE_NUMBER;
        }
        this.pageNumber = pageNumber;
    }

    /**
     * 设置pageSize，如果<1 || > MAX_PAGE_SIZE，则使用默认的
     *
     * @param pageSize
     *         每页显示多少条
     */
    public void setPageSize (Integer pageSize) {
        if (pageSize == null || pageSize < 1 || pageSize > MAX_PAGE_SIZE) {
            pageSize = DEFAULT_PAGE_SIZE;
        }
        this.pageSize = pageSize;
    }

    /**
     * 从哪个位置开始读取数据
     *
     * @return 开始位置
     */
    public int getStartPosition () {
        return (this.getPageNumber() - 1) * this.getPageSize();
    }
}
